home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / game / pr / src / mmv2.00 < prev    next >
Text File  |  1995-08-20  |  17KB  |  673 lines

  1. /*===================================
  2.     Make polygon Map data
  3.                 3D test version.
  4. ===================================*/
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <math.h>
  9. #include    <egb.h>
  10. #include    <filekh.h>
  11.  
  12. char    EgbWork[EgbWorkSize];
  13.  
  14. #define    MAPFILE    "course00.pmd"
  15. #define    C32K(b,r,g)    (0x01*(b)+0x020*(r)+0x400*(g))
  16. #define C32B(col)    ((col)%0x20)
  17. #define C32R(col)    (((col)/0x20)%0x20)
  18. #define C32G(col)    ((col)/0x400)
  19. #define    ROADCOL C32K(18,12,12)
  20. #define EDCOL1  C32K(0,30,0)
  21. #define EDCOL2  C32K(30,30,30)
  22. #define EDGE    5
  23. //#define EDCOL1  C32K(5,5,25)
  24. //#define EDCOL2  C32K(10,5,20)
  25.  
  26. typedef struct {
  27.     short    x,y,z;
  28. } p3d;
  29. typedef struct {                /*    Polygon データ    */
  30.     p3d        pt[4];
  31.     short    type;
  32. } poly;
  33. typedef struct {
  34.     short    px[4];
  35.     short    py[4];
  36.     short    pz;
  37.     p3d        kv;
  38. } rdata;
  39.  
  40. #define RMAX 1800
  41. #define PMAX 6000
  42. #define STEP 400
  43. #define CSTEP 200
  44. //#define    MINSTEP    20
  45. #define RDMAG 5/5
  46. #define SMTLEV 5
  47.  
  48. typedef struct {
  49.     short x,y,z;
  50.     short wl,wr;
  51.     short bank;
  52.     short stp;
  53. } Road;
  54. Road road[RMAX];
  55.  
  56. poly    rdpol[RMAX];
  57. rdata    rddat[RMAX];
  58. short    polmax,pn,rd=0;
  59. poly    mapdata[PMAX];
  60. short    chk[20],chks,exTime[20];
  61.  
  62. //    objects
  63. poly    mt[4];
  64. poly    stand[12];
  65. poly    gt[3];
  66. poly    pd[3];
  67. poly    cp[2];
  68. poly    cvp[5];
  69.  
  70. //short    step=STEP;
  71. double    cang=0;    // current angle
  72. short    cx=0,cy=0,cz=0;
  73. short    cwl=0,cwr=0,cbank=0;
  74. double    pi=_PI;
  75. int        crd=0;    // current road number
  76.  
  77. /*=======================================
  78.     subroutines for setting road[]
  79. =======================================*/
  80. void setR( short stp )
  81. {
  82.     if( crd>=RMAX ) exit ;
  83.     road[crd].x = cx ;
  84.     road[crd].y = cy ;
  85.     road[crd].z = cz+150 ;
  86.     road[crd].wl = cwl ;
  87.     road[crd].wr = cwr ;
  88.     road[crd].bank = cbank ;
  89.     road[crd].stp = stp ;
  90. //    printf("<%d,%d,%d>\n",cx,cy,cz);
  91. }
  92.  
  93. void
  94. goStr( len, nz )
  95.     short    len, nz ;
  96. {
  97.     printf("go strait : %d[%d]\n",len,nz);
  98.     short    clen=0;
  99.     short    sx=cx,sy=cy,sz=cz;
  100.     int        i,j=len/STEP+1 ;
  101.     for(i=1; i<=j; ++i)
  102.     {
  103.         clen = len*i/j ;
  104.         crd++ ;
  105.         cx = sx + clen*cos(cang) ;
  106.         cy = sy + clen*sin(cang) ;
  107.         cz = sz + (nz-sz)*clen/len ;
  108.         setR(len/j);
  109.     }
  110. }
  111.  
  112. void 
  113. curveRt( r, nang, nz, nbank )
  114.     short    r;
  115.     double    nang;
  116.     short    nz, nbank;
  117. {
  118.     printf("curve Right : r=%d,nang=%f,nz=%d\n",r,nang,nz);
  119.     short    ox,oy, sz=cz ;
  120.     short    sbank=cbank ;
  121.     double    sang=cang;
  122.     int        i,j=r*(nang-sang)/CSTEP+1;
  123.     ox = cx - r*sin(cang) ;
  124.     oy = cy + r*cos(cang) ;
  125.     for(i=1; i<=j; ++i)
  126.     {
  127.         cang = sang+(nang-sang)*i/j ;
  128.         ++crd ;
  129.         cx = ox + r*sin(cang) ;
  130.         cy = oy - r*cos(cang) ;
  131.         cz = sz + (nz-sz)*i/j ;
  132.         cbank = sbank + (nbank-sbank)*i/j ;
  133.         setR(r*(nang-sang)/j);
  134. //        if( r<=600 )
  135. //            setCvp( cx,cy,cz+500,cang );
  136.     }
  137.     cang = nang ;
  138.     cz = nz ;
  139.     cbank = nbank;
  140. }
  141. void 
  142. curveLf( r, nang, nz, nbank )
  143.     short    r;
  144.     double    nang;
  145.     short    nz, nbank;
  146. {
  147.     printf("curve Left : %d[%d]\n",r,nz);
  148.     short    ox,oy, sz=cz ;
  149.     short    sbank=cbank ;
  150.     double  sang=cang;
  151.     int        i,j=r*(sang-nang)/CSTEP+1;
  152.     nbank = -nbank ;
  153.     ox = cx + r*sin(cang) ;
  154.     oy = cy - r*cos(cang) ;
  155.     for(i=1; i<=j; ++i)
  156.     {
  157.         cang = sang+(nang-sang)*i/j ;
  158.         ++crd ;
  159.         cx = ox - r*sin(cang) ;
  160.         cy = oy + r*cos(cang) ;
  161.         cz = sz + (nz-sz)*i/j ;
  162.         cbank = sbank + (nbank-sbank)*i/j ;
  163.         setR(r*(sang-nang)/j) ;
  164. //        if( r<=600 )
  165. //            setCvp( cx,cy,cz+500,cang-pi );
  166.     }
  167.     cang = nang ;
  168.     cz = nz ;
  169.     cbank = nbank;
  170. }
  171.  
  172. /*====================
  173.     pol -> kvect
  174. ====================*/
  175. p3d ortholize( p3d vec )
  176. {
  177.     double l;
  178.     l = sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z) ;
  179.     if(l==0) return vec;
  180.  
  181.     vec.x = (double)vec.x*1000/l ;
  182.     vec.y = (double)vec.y*1000/l ;
  183.     vec.z = (double)vec.z*1000/l ;
  184.     return vec ;
  185. }
  186. p3d    exterior( poly pol )
  187. {
  188.     p3d    kv;
  189.     kv.x = (pol.pt[1].y-pol.pt[0].y)*(pol.pt[3].z-pol.pt[0].z)/100
  190.           -(pol.pt[1].z-pol.pt[0].z)*(pol.pt[3].y-pol.pt[0].y)/100 ;
  191.     kv.y = (pol.pt[1].z-pol.pt[0].z)*(pol.pt[3].x-pol.pt[0].x)/100
  192.           -(pol.pt[1].x-pol.pt[0].x)*(pol.pt[3].z-pol.pt[0].z)/100 ;
  193.     kv.z = (pol.pt[1].x-pol.pt[0].x)*(pol.pt[3].y-pol.pt[0].y)/10
  194.           -(pol.pt[1].y-pol.pt[0].y)*(pol.pt[3].x-pol.pt[0].x)/10 ;
  195.     return ortholize( kv );
  196. }
  197. int    inner( p3d a, p3d b )
  198. {
  199.     int i ;
  200.     i = a.x*b.x ;
  201.     i+= a.y*b.y ;
  202.     i+= a.z*b.z ;
  203.     return i ;
  204. }
  205. /*==========================
  206.     超簡易レンダリング?
  207. ==========================*/
  208. short colset( poly pol )
  209. {
  210.     p3d ray ;
  211.     ray.x=1,ray.y=1,ray.z=2 ;
  212.     ray = ortholize( ray ) ;
  213.     p3d kv ;
  214.     kv = exterior( pol ) ;
  215.     int i;
  216.     i = _abs( inner(ray,kv) )/100 ;    // 0 <= i <= 10000
  217.     i = ( 4000 + i*7/10 ) ;        // 環境光 40%
  218.  
  219.     int    b,r,g;
  220.     b = C32B(pol.type) ;
  221.     r = C32R(pol.type) ;
  222.     g = C32G(pol.type) ;
  223.  
  224.     b = ((b*i)/10000) ; b = _min(31,b) ;
  225.     r = ((r*i)/10000) ; r = _min(31,r) ;
  226.     g = ((g*i)/10000) ; g = _min(31,g) ;
  227.     return C32K(b,r,g);
  228. }
  229. /*=================================
  230.     road[] -> mapdata[],rddat[]
  231. =================================*/
  232. #define    X(i)    (road[i].x)
  233. #define    Y(i)    (road[i].y)
  234. #define    Z(i)    (road[i].z)
  235. #define B(i)    (road[i].bank)
  236. #define L(i)    (road[i].wl)
  237. #define R(i)    (road[i].wr)
  238.  
  239. void makeRdat()
  240. {
  241.     p3d p[RMAX][4];
  242.     poly rdpol ;
  243.     short ax,ay,l;
  244.     short x,y,z;
  245.     int i,lz,j,a,b;
  246.     road[0] = road[crd];
  247.     road[crd+1] = road[1];
  248.     //    スムージング
  249.     int smtlev = SMTLEV;
  250.     while(smtlev>=0)
  251.     {
  252.         smtlev--;
  253.         lz=road[crd-1].z ;
  254.         for(i=0; i<=crd; ++i)
  255.         {
  256.             a=road[i].stp;
  257.             b=road[i+1].stp;
  258.             j = ((lz*b+road[i+1].z*a)/(a+b)*1+road[i].z*1)/2 ;
  259.             lz = road[i].z ;
  260.             road[i].z = j;
  261.         }
  262.         road[crd+1] = road[1];
  263.     }
  264.     //    道幅変更(^^;)
  265.     for(i=0; i<=crd+1; ++i)
  266.     {
  267.         road[i].wr = road[i].wr*RDMAG ;
  268.         road[i].wl = road[i].wl*RDMAG ;
  269.     }
  270.     for(i=0; i<=crd; ++i)
  271.     {
  272.         ay = X(i+1) - X(i) ;
  273.         ax =-Y(i+1) + Y(i) ;
  274.         l = sqrt( ax*ax + ay*ay );
  275.  
  276.         p[i][0].x = X(i) - ax* (L(i)+EDGE)/l ;
  277.         p[i][0].y = Y(i) - ay* (L(i)+EDGE)/l ;
  278.         p[i][0].z = Z(i) + (L(i)+EDGE)*sin((B(i)+20)*pi/1800)*10 ;
  279.  
  280.         p[i][1].x = X(i) - ax* L(i)/l ;
  281.         p[i][1].y = Y(i) - ay* L(i)/l ;
  282.         p[i][1].z = Z(i) + L(i)*sin(B(i)*pi/1800)*10 ;
  283.  
  284.         p[i][2].x = X(i) + ax* R(i)/l ;
  285.         p[i][2].y = Y(i) + ay* R(i)/l ;
  286.         p[i][2].z = Z(i) - R(i)*sin((B(i)+20)*pi/1800)*10 ;
  287.  
  288.         p[i][3].x = X(i) + ax* (R(i)+EDGE)/l ;
  289.         p[i][3].y = Y(i) + ay* (R(i)+EDGE)/l ;
  290.         p[i][3].z = Z(i) - (R(i)+EDGE)*sin(B(i)*pi/1800)*10 ;
  291.     }
  292.     for(i=0; i<4; ++i)
  293.         p[crd+1][i] = p[crd][i];
  294.     for(i=0; i<crd; ++i)
  295.     {
  296.         mapdata[pn].pt[0] = p[i][0] ;
  297.         mapdata[pn].pt[1] = p[i+1][0] ;
  298.         mapdata[pn].pt[2] = p[i+1][1] ;
  299.         mapdata[pn].pt[3] = p[i][1] ;
  300.         mapdata[pn].type = (i%2==0 ? EDCOL1 : EDCOL2 ) ;
  301.         mapdata[pn].type = colset(mapdata[pn]);
  302.         
  303.         ++pn ;
  304.         mapdata[pn].pt[0] = p[i][1] ;
  305.         mapdata[pn].pt[1] = p[i+1][1] ;
  306.         mapdata[pn].pt[2] = p[i+1][2] ;
  307.         mapdata[pn].pt[3] = p[i][2] ;
  308.         mapdata[pn].type = ROADCOL ;
  309.         mapdata[pn].type = colset(mapdata[pn]);
  310.         ++pn ;
  311.         mapdata[pn].pt[0] = p[i][2];
  312.         mapdata[pn].pt[1] = p[i+1][2];
  313.         mapdata[pn].pt[2] = p[i+1][3];
  314.         mapdata[pn].pt[3] = p[i][3];
  315.         mapdata[pn].type = (i%2==0 ? EDCOL1 : EDCOL2 ) ;
  316.         mapdata[pn].type = colset(mapdata[pn]);
  317.         ++pn;
  318.  
  319.         rdpol.pt[0] = p[i][1] ;
  320.         rdpol.pt[1] = p[i+1][1] ;
  321.         rdpol.pt[2] = p[i+1][2] ;
  322.         rdpol.pt[3] = p[i][2] ;
  323.  
  324.         rddat[rd].px[0] = p[i][1].x ;
  325.         rddat[rd].py[0] = p[i][1].y ;
  326.         rddat[rd].px[1] = p[i+1][1].x ;
  327.         rddat[rd].py[1] = p[i+1][1].y ;
  328.         rddat[rd].px[2] = p[i+1][2].x ;
  329.         rddat[rd].py[2] = p[i+1][2].y ;
  330.         rddat[rd].px[3] = p[i][2].x ;
  331.         rddat[rd].py[3] = p[i][2].y ;
  332.         rddat[rd].pz = p[i][1].z ;
  333.         rddat[rd].kv = exterior( rdpol ) ;
  334.         rd++ ;
  335.     }
  336. }
  337.  
  338. save_texdat( short sx, short sy, double sang )
  339. {
  340.     short    sangle;
  341.     int i,j,k;
  342.     sang = sang*500/pi;
  343.     sangle = sang;
  344.     sangle = (sangle+10000)%1000;
  345.  
  346.     FILE *fp;
  347.     fp=fopen(MAPFILE,"wb");
  348.     if (fp==NULL) return 0;
  349.  
  350.     putShort(sx,fp);
  351.     putShort(sy,fp);
  352.     putShort(sangle,fp);
  353.  
  354.     putShort(polmax,fp);
  355.     for (i=0;i<polmax;i++){
  356.         for(j=0; j<4; ++j){
  357.             putShort(mapdata[i].pt[j].x,fp);
  358.             putShort(mapdata[i].pt[j].y,fp);
  359.             putShort(mapdata[i].pt[j].z,fp);
  360.         }
  361.         putShort(mapdata[i].type,fp);
  362.     }
  363.  
  364.     putShort(rd,fp);
  365.     fwrite((char *)rddat, sizeof(rdata), rd, fp);
  366.     putShort(chks,fp);
  367.     fwrite((char *)chk, sizeof(short), chks, fp);
  368.     fwrite((char *)exTime, sizeof(short), chks, fp);
  369.  
  370.     if (ferror(fp)){
  371.         puts("File write error!!");
  372.         return 0;
  373.     }
  374.     return 1;
  375. }
  376.  
  377. void    initGrp()
  378. {
  379.     EGB_init( EgbWork, EgbWorkSize );    /* 初期化           */
  380.     EGB_resolution ( EgbWork, 0, 3 );    /* 32k(320*240)        */
  381.     EGB_resolution ( EgbWork, 1, 3 );    /* 16 (640*480)        */
  382.     EGB_displayPage( EgbWork, 1, 3 );    /* 表示ページの指定    */
  383.  
  384.     EGB_writePage  ( EgbWork, 0    );
  385.     EGB_writeMode  ( EgbWork, 0    );    /*※描画モードの設定 */
  386.     EGB_paintMode  ( EgbWork, 0x20 );
  387. }
  388.  
  389. void    putlmap()
  390. {
  391.     int    i, j;
  392.     char    para[10];
  393.     struct {
  394.         unsigned short    num;
  395.         short    p[8];
  396.     } poly;
  397.     poly.num = 4;
  398.  
  399.     EGB_paintMode( EgbWork, 0x02 );
  400.     for(i=0; i<=25000; i+=500)
  401.     {
  402.         EGB_color( EgbWork, 0, i%5000==0 ? 9 : 1 );
  403.         WORD(para+0) = 2;
  404.         WORD(para+2) = 0;    WORD(para+4) = i*640/25000;//480
  405.         WORD(para+6) = 639;    WORD(para+8) = i*640/25000;
  406.         EGB_connect( EgbWork, para );
  407.         WORD(para+4) = 0;    WORD(para+2) = i*640/25000;
  408.         WORD(para+8) = 639;    WORD(para+6) = i*640/25000;
  409.         EGB_connect( EgbWork, para );
  410.     }
  411.  
  412.     EGB_paintMode( EgbWork, 0x02 );
  413.     for(i=0; i<polmax; ++i){
  414.         for(j=0; j<4; ++j){
  415.             poly.p[2*j  ] = mapdata[i].pt[j].x *640/25000;
  416.             poly.p[2*j+1] = mapdata[i].pt[j].y *640/25000;
  417.         }
  418.         EGB_color( EgbWork, 2, 15 );
  419.         EGB_polygon( EgbWork, &poly );
  420.     }
  421. }
  422. void    putPoly( pol, n, x,y,z, angle, dx,dy,dz, dcol )
  423.     poly *pol;
  424.     int n;
  425.     short x,y,z;
  426.     double angle;
  427.     int dx,dy,dz;
  428.     short dcol;
  429. {
  430.     dz *=10;
  431.     int i,j;
  432.     for(i=0; i<n; ++i)
  433.     {
  434.         for(j=0; j<4; ++j)
  435.         {
  436.             mapdata[pn].pt[j].x =    pol[i].pt[j].x*cos(angle)*dx -
  437.                                     pol[i].pt[j].y*sin(angle)*dy +x;
  438.             mapdata[pn].pt[j].y =    pol[i].pt[j].x*sin(angle)*dx +
  439.                                       pol[i].pt[j].y*cos(angle)*dy +y;
  440.             mapdata[pn].pt[j].z =    pol[i].pt[j].z*dz +z;
  441.             mapdata[pn].type = (pol[i].type)*dcol;
  442.         }
  443.         ++pn;
  444.     }
  445. }
  446.  
  447. //    以上 共通部分
  448. void    setPolData()
  449. {
  450.     //    Mountain    ( 四角錐 )
  451.     mt[0].pt[0].x =0;    mt[0].pt[0].y =1;    mt[0].pt[0].z =0;
  452.     mt[0].pt[1].x =1;    mt[0].pt[1].y =0;    mt[0].pt[1].z =0;
  453.     mt[0].pt[2].x =0;    mt[0].pt[2].y =0;    mt[0].pt[2].z =1;
  454.     mt[0].pt[3].x =0;    mt[0].pt[3].y =0;    mt[0].pt[3].z =1;
  455.     mt[0].type = 25;
  456.     mt[1].pt[0].x =1;    mt[1].pt[0].y =0;    mt[1].pt[0].z =0;
  457.     mt[1].pt[1].x =0;    mt[1].pt[1].y =-1;    mt[1].pt[1].z =0;
  458.     mt[1].pt[2].x =0;    mt[1].pt[2].y =0;    mt[1].pt[2].z =1;
  459.     mt[1].pt[3].x =0;    mt[1].pt[3].y =0;    mt[1].pt[3].z =1;
  460.     mt[1].type = 28;
  461.     mt[2].pt[0].x =0;    mt[2].pt[0].y =-1;    mt[2].pt[0].z =0;
  462.     mt[2].pt[1].x =-1;    mt[2].pt[1].y =0;    mt[2].pt[1].z =0;
  463.     mt[2].pt[2].x =0;    mt[2].pt[2].y =0;    mt[2].pt[2].z =1;
  464.     mt[2].pt[3].x =0;    mt[2].pt[3].y =0;    mt[2].pt[3].z =1;
  465.     mt[2].type = 31;
  466.     mt[3].pt[0].x =-1;    mt[3].pt[0].y =0;    mt[3].pt[0].z =0;
  467.     mt[3].pt[1].x =0;    mt[3].pt[1].y =1;    mt[3].pt[1].z =0;
  468.     mt[3].pt[2].x =0;    mt[3].pt[2].y =0;    mt[3].pt[2].z =1;
  469.     mt[3].pt[3].x =0;    mt[3].pt[3].y =0;    mt[3].pt[3].z =1;
  470.     mt[3].type = 28;
  471.  
  472.     //    Stand
  473.     short    i,j,n;
  474.     short    scol[3][4]={ 
  475.         { C32K(31,0,10),C32K(31,0,15),C32K(31,0,12),C32K(31,0,16) },
  476.         { C32K(31,0,18),C32K(31,0,22),C32K(31,0,10),C32K(31,0,19) },
  477.         { C32K(31,0,15),C32K(31,0,11),C32K(31,0,18),C32K(31,0,13) } };
  478.     for(i=0; i<4; ++i)
  479.         for(j=0; j<3; ++j){
  480.             n=i*3+j;
  481.     stand[n].pt[0].x =i;    stand[n].pt[0].y =-j;    stand[n].pt[0].z =j;
  482.     stand[n].pt[1].x =i+1;    stand[n].pt[1].y =-j;    stand[n].pt[1].z =j;
  483.     stand[n].pt[2].x =i+1;    stand[n].pt[2].y=-j-1;    stand[n].pt[2].z =j+1;
  484.     stand[n].pt[3].x =i;    stand[n].pt[3].y=-j-1;    stand[n].pt[3].z =j+1;
  485.     stand[n].type = scol[j][i];
  486.         }
  487.  
  488.     //    Pond
  489.     pd[0].pt[0].x =-15;    pd[0].pt[0].y =5;    pd[0].pt[0].z =0;
  490.     pd[0].pt[1].x =-5;    pd[0].pt[1].y =7;    pd[0].pt[1].z =0;
  491.     pd[0].pt[2].x =0;    pd[0].pt[2].y =15;    pd[0].pt[2].z =0;
  492.     pd[0].pt[3].x =-12;    pd[0].pt[3].y =15;    pd[0].pt[3].z =0;
  493.     pd[0].type = 31;
  494.     pd[1].pt[0].x =-12;    pd[1].pt[0].y =15;    pd[1].pt[0].z =0;
  495.     pd[1].pt[1].x =0;    pd[1].pt[1].y =15;    pd[1].pt[1].z =0;
  496.     pd[1].pt[2].x =2;    pd[1].pt[2].y =22;    pd[1].pt[2].z =0;
  497.     pd[1].pt[3].x =-3;    pd[1].pt[3].y =25;    pd[1].pt[3].z =0;
  498.     pd[1].type = 31;
  499.     pd[2].pt[0].x =25;    pd[2].pt[0].y =5;    pd[2].pt[0].z =0;
  500.     pd[2].pt[1].x =30;    pd[2].pt[1].y =13;    pd[2].pt[1].z =0;
  501.     pd[2].pt[2].x =25;    pd[2].pt[2].y =20;    pd[2].pt[2].z =0;
  502.     pd[2].pt[3].x =17;    pd[2].pt[3].y =17;    pd[2].pt[3].z =0;
  503.     pd[2].type = 31;
  504.  
  505.     //    Gate
  506.     gt[0].pt[0].x =0;    gt[0].pt[0].y =-10;    gt[0].pt[0].z =0;
  507.     gt[0].pt[1].x =0;    gt[0].pt[1].y =-11;    gt[0].pt[1].z =0;
  508.     gt[0].pt[2].x =0;    gt[0].pt[2].y =-11;    gt[0].pt[2].z =8;
  509.     gt[0].pt[3].x =0;    gt[0].pt[3].y =-10;    gt[0].pt[3].z =8;
  510.     gt[0].type = 31;
  511.     gt[1].pt[0].x =0;    gt[1].pt[0].y =10;    gt[1].pt[0].z =0;
  512.     gt[1].pt[1].x =0;    gt[1].pt[1].y =11;    gt[1].pt[1].z =0;
  513.     gt[1].pt[2].x =0;    gt[1].pt[2].y =11;    gt[1].pt[2].z =8;
  514.     gt[1].pt[3].x =0;    gt[1].pt[3].y =10;    gt[1].pt[3].z =8;
  515.     gt[1].type = 31;
  516.     gt[2].pt[0].x =0;    gt[2].pt[0].y =-11;    gt[2].pt[0].z =8;
  517.     gt[2].pt[1].x =0;    gt[2].pt[1].y =-11;    gt[2].pt[1].z =10;
  518.     gt[2].pt[2].x =0;    gt[2].pt[2].y =11;    gt[2].pt[2].z =10;
  519.     gt[2].pt[3].x =0;    gt[2].pt[3].y =11;    gt[2].pt[3].z =8;
  520.     gt[2].type = 31;
  521.     
  522.     //    Check Point
  523.     cp[0].pt[0].x =0;    cp[0].pt[0].y =-10;    cp[0].pt[0].z =0;
  524.     cp[0].pt[1].x =0;    cp[0].pt[1].y =-11;    cp[0].pt[1].z =0;
  525.     cp[0].pt[2].x =0;    cp[0].pt[2].y =-11;    cp[0].pt[2].z =10;
  526.     cp[0].pt[3].x =0;    cp[0].pt[3].y =-10;    cp[0].pt[3].z =10;
  527.     cp[0].type = 31;
  528.     cp[1].pt[0].x =0;    cp[1].pt[0].y =10;    cp[1].pt[0].z =0;
  529.     cp[1].pt[1].x =0;    cp[1].pt[1].y =11;    cp[1].pt[1].z =0;
  530.     cp[1].pt[2].x =0;    cp[1].pt[2].y =11;    cp[1].pt[2].z =10;
  531.     cp[1].pt[3].x =0;    cp[1].pt[3].y =10;    cp[1].pt[3].z =10;
  532.     cp[1].type = 31;
  533.  
  534.     //    Curve ( Panel )
  535.     cvp[0].pt[0].x =0;    cvp[0].pt[0].y =-10;    cvp[0].pt[0].z =49;
  536.     cvp[0].pt[1].x =0;    cvp[0].pt[1].y =0;        cvp[0].pt[1].z =42;
  537.     cvp[0].pt[2].x =0;    cvp[0].pt[2].y =10;     cvp[0].pt[2].z =42;
  538.     cvp[0].pt[3].x =0;    cvp[0].pt[3].y =0;        cvp[0].pt[3].z =49;
  539.     cvp[0].type = C32K(0,30,30);
  540.     cvp[1].pt[0].x =0;    cvp[1].pt[0].y =-10;    cvp[1].pt[0].z =35;
  541.     cvp[1].pt[1].x =0;    cvp[1].pt[1].y =0;        cvp[1].pt[1].z =42;
  542.     cvp[1].pt[2].x =0;    cvp[1].pt[2].y =10;     cvp[1].pt[2].z =42;
  543.     cvp[1].pt[3].x =0;    cvp[1].pt[3].y =0;        cvp[1].pt[3].z =35;
  544.     cvp[1].type = C32K(0,30,30);
  545.     cvp[3].pt[0].x =0;    cvp[3].pt[0].y =0;    cvp[3].pt[0].z =19;
  546.     cvp[3].pt[1].x =0;    cvp[3].pt[1].y =10;    cvp[3].pt[1].z =19;
  547.     cvp[3].pt[2].x =0;    cvp[3].pt[2].y =10;    cvp[3].pt[2].z =12;
  548.     cvp[3].pt[3].x =0;    cvp[3].pt[3].y =0;    cvp[3].pt[3].z =19;
  549.     cvp[3].type = 0;
  550.     cvp[4].pt[0].x =0;    cvp[4].pt[0].y =0;    cvp[4].pt[0].z =5;
  551.     cvp[4].pt[1].x =0;    cvp[4].pt[1].y =10;    cvp[4].pt[1].z =5;
  552.     cvp[4].pt[2].x =0;    cvp[4].pt[2].y =10;    cvp[4].pt[2].z =12;
  553.     cvp[4].pt[3].x =0;    cvp[4].pt[3].y =0;    cvp[4].pt[3].z =5;
  554.     cvp[4].type = 0;
  555.     cvp[2].pt[0].x =0;    cvp[2].pt[0].y =-10;    cvp[2].pt[0].z =19;
  556.     cvp[2].pt[1].x =0;    cvp[2].pt[1].y =0;        cvp[2].pt[1].z =12;
  557.     cvp[2].pt[2].x =0;    cvp[2].pt[2].y =-10;    cvp[2].pt[2].z =5;
  558.     cvp[2].pt[3].x =0;    cvp[2].pt[3].y =-10;    cvp[2].pt[3].z =5;
  559.     cvp[2].type = 0;
  560. }
  561.  
  562. void    setStandLf( short r, short h, short l, short sz )
  563. {
  564.     short    sx,sy;
  565.     sx = cx+r*sin(cang);
  566.     sy = cy-r*cos(cang);
  567.     putPoly( stand, 12, sx,sy,sz, cang, l/4, h/2, h/3, 1);
  568. }
  569.  
  570. void    setStandRt( short r, short h, short l, short sz )
  571. {
  572.     short    sx,sy;
  573.     sx = cx-r*sin(cang);
  574.     sy = cy+r*cos(cang);
  575.     putPoly( stand, 12, sx,sy,sz, cang, l/4, -h/2, h/3, 1);
  576. }
  577.  
  578. int     putChkPt()
  579. {
  580.     putPoly( cp, 2,cx,cy,cz,cang, 1, (_max(cwr,cwl)+9)/10, 5, C32K(0,1,1));
  581.     return crd;
  582. }
  583.  
  584. main()
  585. {
  586.     setPolData();
  587.     int    i;
  588.     double    ang,mang;
  589.     pn = 0;
  590.     putPoly( mt, 4,19000, 9000,0, 0.0,    300,300,200, C32K(0,0,1) );
  591.     putPoly( mt, 4,14000,14000,0, 0.0,    400,400,270, C32K(0,0,1) );
  592.     putPoly( mt, 4, 5000, 8000,0, 0.0,    300,300,200, C32K(0,0,1) );
  593.  
  594.     crd = 0;
  595.     cx = 10000;
  596.     cy = 10000;
  597.     cz = 0;
  598.     cwl = 100;
  599.     cwr = 100;
  600.     cbank = 0;
  601.     cang = mang = 0;    //    x方向
  602.     chks = 0;
  603.     setR(STEP);
  604.     setStandRt( 200, 150, 1000, cz );
  605.     putPoly( gt, 3, cx,cy,cz,cang, 120/10, 120/10, 10, C32K(1,1,1) );
  606.  
  607.     goStr( 6000, 0 );
  608.  
  609.     mang = -75*_PI/180;
  610.     curveLf( 500, mang, 0, 0 );
  611.  
  612.     goStr( 3000, 0 );
  613.  
  614.     chk[chks] = putChkPt();
  615.     chks++;
  616.  
  617.     mang = -150*_PI/180;
  618.     curveLf( 500, mang, 0, 0 );
  619.  
  620.     goStr( 2000, 0 );
  621.  
  622.     mang = -255*_PI/180;
  623.     curveLf( 400, mang, 0, 0 );
  624.  
  625.     goStr( 2000, 0 );
  626.     goStr( 500, 1000 );
  627.     goStr( 5000, 1000 );
  628.  
  629.     mang = -180*_PI/180;
  630.     curveRt( 800, mang, 1000, 0 );
  631.  
  632.     goStr( 2000, 1100 );
  633.  
  634.     mang = (-180-70)*_PI/180;
  635.     curveLf( 200, mang, 1100, 0 );
  636.     goStr( 400, 1100 );
  637.     mang = -180*_PI/180;
  638.     curveRt( 200, mang, 1100, 0 );
  639.  
  640.     chk[chks] = putChkPt();
  641.     chks++;
  642.  
  643.     goStr( 1000, 1100 );
  644.     goStr( 1000, 0 );
  645.  
  646.     mang = 0*_PI/180;
  647.     curveRt( 2000-61, mang, 0, 0 );
  648.  
  649.     goStr( 2528, 0 );
  650.  
  651.     printf("pols : %dx3\n",crd);
  652.     printf("start: %d,%d end:%d,%d\n",road[0].x,road[0].y,
  653.                                     road[crd].x,road[crd].y);
  654.     for(i=0; chk[i]!=0; ++i)
  655.         printf("ChkPoint%d:%d\n",i,chk[i]);
  656.     exTime[0] = 20;
  657.     exTime[1] = 20;
  658.  
  659.     exTime[2] = 10;
  660.  
  661.     makeRdat();
  662.     polmax = pn;
  663.     save_texdat(road[0].x-600,road[0].y,0);
  664.  
  665.     initGrp();
  666.     putlmap();
  667.     getchar();
  668.  
  669.     return 0;
  670. }
  671.  
  672.  
  673.